package com.zzy.system.domain;

import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zzy.common.core.domain.BaseEntity;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * 订单实体类，用于表示订单的各种属性信息。
 */
@Data
public class SaleOrder extends BaseEntity {
    //主键 自增
    @TableId(type = IdType.AUTO)
    private Integer saleOrderId;
    private static final long serialVersionUID = 1L;
    /**
     * 订单id，用于唯一标识每一个订单，是整个业务流程中关联订单相关数据的核心依据，在系统内具有唯一性。
     */
    @JSONField(name = "order_id")
    private String orderId;

    /**
     * 第三方order_id，用于与外部第三方系统中的订单进行关联和交互，方便数据同步以及跨系统业务操作。
     */
    @JSONField(name = "out_order_id")
    private String outOrderId;

    /**
     * 业务状态，用于表示订单当前所处的业务进展阶段，取值限定为1（'等待分拣'）、5（'正在分拣'）、10（'正在配送'）、15（'已签收'），通过该属性可以清晰了解订单的处理情况。
     */
    @JSONField(name = "status")
    private int status;

    /**
     * 支付状态，用于体现订单的支付情况，取值限定为1（'未支付'）、5（'部分支付'）、10（'已支付'），有助于业务系统对订单的财务状态进行跟踪和处理。
     */
    @JSONField(name = "pay_status")
    private int payStatus;

    /**
     * 时间配置id，关联对应的时间配置信息，可用于确定订单在不同阶段的时间相关规则和限制，例如配送时间范围等。
     */
    @JSONField(name = "time_config_id")
    private String timeConfigId;

    /**
     * 分拣序号，在分拣流程中用于标识订单的先后顺序，方便分拣操作按照一定顺序进行，提高分拣效率和准确性。
     */
    @JSONField(name = "sort_id")
    private String sortId;

    /**
     * 运费，记录该订单需要支付的运输费用，使用Float类型表示金额数值（若对精度要求较高，可考虑使用BigDecimal类型）。
     */
    @JSONField(name = "freight")
    private BigDecimal freight;

    /**
     * 出库价格（根据真实重量算出的真实价格），反映了商品从仓库出库时基于实际重量计算得出的价格，是订单成本核算等业务操作的重要数据之一。
     */
    @JSONField(name = "out_stock_amount")
    private BigDecimal outStockAmount;

    /**
     * 下单金额，代表用户下单时订单的总金额，是整个订单金额体系的基础数据，后续的各种金额调整都会基于此进行计算。
     */
    @JSONField(name = "order_amount")
    private BigDecimal orderAmount;

    /**
     * 异常金额，可能会出现负值，用于记录订单中因某些异常情况（如商品损坏、价格调整等）产生的金额变动情况，便于财务核算和业务分析。
     */
    @JSONField(name = "abnormal_sku_amount")
    private BigDecimal abnormalSkuAmount;

    /**
     * 退货金额，同样可能存在负值，用于统计用户退回商品对应的金额数值，对订单的最终结算金额有影响。
     */
    @JSONField(name = "refund_sku_amount")
    private BigDecimal refundSkuAmount;

    /**
     * 优惠券金额，不存在负值，记录用户使用优惠券所减免的金额，用于在计算应付金额等操作中体现优惠情况。
     */
    @JSONField(name = "coupon_amount")
    private BigDecimal couponAmount;

    /**
     * 应付金额：出库金额去掉异常金额、退货金额与优惠券抵扣后的值，且不包含运费，是用户最终需要实际支付的金额（不考虑运费单独支付情况），是订单结算的关键数据。
     */
    @JSONField(name = "total_amount")
    private BigDecimal totalAmount;

    /**
     * 下单时间，以字符串形式记录订单创建的时间信息，格式需遵循一定的业务规范，便于后续的时间顺序统计和业务流程追溯。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JSONField(name = "date_time")
    private Date dateTime;

    /**
     * 观麦订单修改时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JSONField(name = "modify_time")
    private Date guanmaiModifyTime;

    /**
     * 收货开始时间，明确用户可以开始接收商品的起始时间，用于提醒用户以及安排配送等业务环节的时间规划。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JSONField(name = "receive_begin_time")
    private Date receiveBeginTime;

    /**
     * 收货结束时间，限定用户接收商品的截止时间，超过此时间可能涉及一些业务处理（如联系用户、重新安排配送等）。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JSONField(name = "receive_end_time")
    private Date receiveEndTime;

    /**
     * 备注，用于记录关于该订单的其他额外信息、特殊说明等，方便业务人员查看和了解订单的特殊情况。
     */
    @JSONField(name = "remark")
    private String remark;

    /**
     * 订单类型：A，A类；B，B类；N，常规，通过该属性可以对订单进行分类管理，不同类型的订单可能在业务处理流程、规则等方面存在差异。
     */
    @JSONField(name = "order_process_type_name")
    private String orderProcessTypeName;

    /**
     * 结算方式，取值为1表示先货后款，即先交付货物后支付款项；取值为2表示先款后货，即先支付款项后交付货物，用于明确订单的财务结算规则。
     */
    @JSONField(name = "settle_way")
    private int settleWay;
    //推送订单失败次数
    private Integer pushErrorNum;
    //是否推送成功 0失败 1 成功
    private Integer isPush;
    @JSONField(name = "customer")
    @TableField(exist = false)
    private SaleOrderCustomer customer;
    @JSONField(name = "details")
    @TableField(exist = false)
    private List<SaleOrderDetail> details;
    //推送溯源报告失败次数
    private Integer pushTraceErrorNum;
    //是否推送溯源报告 0失败 1 成功
    private Integer isPushTrace;


}